package com.changgou.service.goods.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.changgou.goods.Goods;
import com.changgou.goods.Sku;
import com.changgou.goods.Spu;
import com.changgou.goods.pojo.Brand;
import com.changgou.goods.pojo.Category;
import com.changgou.service.goods.dao.SkuMapper;
import com.changgou.service.goods.dao.SpuMapper;
import com.changgou.service.goods.service.BrandService;
import com.changgou.service.goods.service.CategoryService;
import com.changgou.service.goods.service.SpuService;
import com.changgou.util.IdWorker;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

@Service
public class SpuServiceImpl extends ServiceImpl<SpuMapper, Spu> implements SpuService {
    @Resource
    private CategoryService categoryService;

    @Resource
    private BrandService brandService;

    @Resource
    private IdWorker idWorker;

    @Resource
    private SkuMapper skuMapper;



    @Override
    public void add(Goods goods) {
//        先添加 spu
        Spu spu = goods.getSpu();
        long spuId = idWorker.nextId();
        spu.setId(Convert.toStr(spuId));
        spu.setIsDelete("0");
        spu.setIsMarketable("0");
        spu.setStatus("0");
        super.save(spu);
//        然后保持 sku 集合。
        this.saveSkuList(goods);
    }

    /**
     * 根据id 查询 goods.
     * @param id
     * @return
     */
    @Override
    public Goods findGoodsById(String id) {
//        查询 spu
        Spu spu = this.getById(id);

//        然后查询 sku 列表。
        LambdaQueryWrapper<Sku> wrapper = Wrappers.<Sku>lambdaQuery().eq(Sku::getSpuId, spu.getId());

        List<Sku> skus = this.skuMapper.selectList(wrapper);
        Goods goods = new Goods();
        goods.setSpu(spu);
        goods.setSkuList(skus);
        return goods;
    }

    @Override
    public void updateSpuAndSku(Goods goods, String id) {
//        取出spu 的部分
        Spu spu = goods.getSpu();
        super.updateById(spu);
//        删除原先的sku列表

        LambdaQueryWrapper<Sku> wrapper = Wrappers.<Sku>lambdaQuery().eq(Sku::getSpuId, spu.getId());
        this.skuMapper.delete(wrapper);

        //添加新的修改集合。
        this.add(goods);

    }

    @Override
    public void audit(String id) {
//        查询 spu对象
        Spu spu = this.getById(id);
        if(ObjectUtil.isEmpty(spu)){
            throw new RuntimeException("当前商品不存在");
        }
//        判断当前spu 是否存在删除状态。
        if("1".equals(spu.getIsDelete())){
            throw new RuntimeException("当前商品处于删除状态");
        }
//        不处于删除状态，修改审核状态为1,上下架状态为1
        spu.setStatus("1");
        spu.setIsMarketable("1");
//        执行修改操作.
        this.updateById(spu);
    }

    @Override
    public void put(String id) {
        Spu spu = this.getById(id);
        if(!spu.getStatus().equals("1")){
           throw new RuntimeException("未能通过审核的商品不能上架!");
        }
        spu.setIsMarketable("1");
        this.updateById(spu);
    }

    @Override
    public void restore(String id) {
        Spu spu = this.getById(id);
//        检查是否删除的商品
        if(!spu.getIsDelete().equals("1")){
            throw new RuntimeException("此商品未删除!");
        }
        spu.setIsDelete("0");
        spu.setStatus("0");
        this.updateById(spu);
    }

    @Override
    public void realDelete(String id) {
        Spu spu = this.getById(id);
//        检查是否删除的商品
        if(!spu.getIsDelete().equals("1")){
            throw new RuntimeException("此商品未删除");
        }
        this.removeById(id);
    }

    /**
     * 保存sku列表
     * @param goods
     */
    private void saveSkuList(Goods goods){
//        获取spu对象。
        Spu spu = goods.getSpu();
//        当前日期。
        Date date = new Date();
//        获取品牌对象。
        Brand brand = this.brandService.getById(spu.getBrandId());
//        获取分类对象。
        Category category = this.categoryService.getById(spu.getCategory3Id());
//        获取sku集合对象。
        List<Sku> skuList = goods.getSkuList();
        if(CollUtil.isNotEmpty(skuList)){
            for (Sku sku : skuList) {
//                设置id
                sku.setId(Convert.toStr(idWorker.nextId()));
//                设置sku规格。
                if(sku.getSpec() == null || "".equals(sku.getSpec())){
                    sku.setSpec("{}");
                }
//              设置sku 名称（商品名称+规格）
                String name = spu.getName();
//                将json字符串转换成 map。
                spu.setName(spu.getName()+sku.getSpec());

                sku.setName(name);//名称
                sku.setSpuId(spu.getId());//设置spu的ID
                sku.setCreateTime(date);//创建日期
                sku.setUpdateTime(date);//修改日期
                sku.setCategoryId(category.getId());//商品分类ID
                sku.setCategoryName(category.getName());//商品分类名称
                sku.setBrandName(brand.getName());//品牌名称
                this.skuMapper.insert(sku);
            }
        }
    }
}
